home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / python2.4 / idlelib / FormatParagraph.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2005-10-18  |  5KB  |  134 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.4)
  3.  
  4. import re
  5. from configHandler import idleConf
  6.  
  7. class FormatParagraph:
  8.     menudefs = [
  9.         ('format', [
  10.             ('Format Paragraph', '<<format-paragraph>>')])]
  11.     
  12.     def __init__(self, editwin):
  13.         self.editwin = editwin
  14.  
  15.     
  16.     def close(self):
  17.         self.editwin = None
  18.  
  19.     
  20.     def format_paragraph_event(self, event):
  21.         maxformatwidth = int(idleConf.GetOption('main', 'FormatParagraph', 'paragraph'))
  22.         text = self.editwin.text
  23.         (first, last) = self.editwin.get_selection_indices()
  24.         if first and last:
  25.             data = text.get(first, last)
  26.             comment_header = ''
  27.         else:
  28.             (first, last, comment_header, data) = find_paragraph(text, text.index('insert'))
  29.         if comment_header:
  30.             lines = data.split('\n')
  31.             lines = map((lambda st, l = len(comment_header): st[l:]), lines)
  32.             data = '\n'.join(lines)
  33.             format_width = max(maxformatwidth - len(comment_header), 20)
  34.             newdata = reformat_paragraph(data, format_width)
  35.             newdata = newdata.split('\n')
  36.             block_suffix = ''
  37.             if not newdata[-1]:
  38.                 block_suffix = '\n'
  39.                 newdata = newdata[:-1]
  40.             
  41.             
  42.             builder = lambda item, prefix = comment_header: prefix + item
  43.             newdata = '\n'.join(map(builder, newdata)) + block_suffix
  44.         else:
  45.             newdata = reformat_paragraph(data, maxformatwidth)
  46.         text.tag_remove('sel', '1.0', 'end')
  47.         if newdata != data:
  48.             text.mark_set('insert', first)
  49.             text.undo_block_start()
  50.             text.delete(first, last)
  51.             text.insert(first, newdata)
  52.             text.undo_block_stop()
  53.         else:
  54.             text.mark_set('insert', last)
  55.         text.see('insert')
  56.  
  57.  
  58.  
  59. def find_paragraph(text, mark):
  60.     (lineno, col) = map(int, mark.split('.'))
  61.     line = text.get('%d.0' % lineno, '%d.0 lineend' % lineno)
  62.     while text.compare('%d.0' % lineno, '<', 'end') and is_all_white(line):
  63.         lineno = lineno + 1
  64.         line = text.get('%d.0' % lineno, '%d.0 lineend' % lineno)
  65.     first_lineno = lineno
  66.     comment_header = get_comment_header(line)
  67.     comment_header_len = len(comment_header)
  68.     while get_comment_header(line) == comment_header and not is_all_white(line[comment_header_len:]):
  69.         lineno = lineno + 1
  70.         line = text.get('%d.0' % lineno, '%d.0 lineend' % lineno)
  71.     last = '%d.0' % lineno
  72.     lineno = first_lineno - 1
  73.     line = text.get('%d.0' % lineno, '%d.0 lineend' % lineno)
  74.     while lineno > 0 and get_comment_header(line) == comment_header and not is_all_white(line[comment_header_len:]):
  75.         lineno = lineno - 1
  76.         line = text.get('%d.0' % lineno, '%d.0 lineend' % lineno)
  77.     first = '%d.0' % (lineno + 1)
  78.     return (first, last, comment_header, text.get(first, last))
  79.  
  80.  
  81. def reformat_paragraph(data, limit):
  82.     lines = data.split('\n')
  83.     i = 0
  84.     n = len(lines)
  85.     while i < n and is_all_white(lines[i]):
  86.         i = i + 1
  87.     if i >= n:
  88.         return data
  89.     
  90.     indent1 = get_indent(lines[i])
  91.     if i + 1 < n and not is_all_white(lines[i + 1]):
  92.         indent2 = get_indent(lines[i + 1])
  93.     else:
  94.         indent2 = indent1
  95.     new = lines[:i]
  96.     partial = indent1
  97.     while i < n and not is_all_white(lines[i]):
  98.         words = re.split('(\\s+)', lines[i])
  99.         for j in range(0, len(words), 2):
  100.             word = words[j]
  101.             if not word:
  102.                 continue
  103.             
  104.             if len((partial + word).expandtabs()) > limit and partial != indent1:
  105.                 new.append(partial.rstrip())
  106.                 partial = indent2
  107.             
  108.             partial = partial + word + ' '
  109.             if j + 1 < len(words) and words[j + 1] != ' ':
  110.                 partial = partial + ' '
  111.                 continue
  112.         
  113.         i = i + 1
  114.     new.append(partial.rstrip())
  115.     new.extend(lines[i:])
  116.     return '\n'.join(new)
  117.  
  118.  
  119. def is_all_white(line):
  120.     return re.match('^\\s*$', line) is not None
  121.  
  122.  
  123. def get_indent(line):
  124.     return re.match('^(\\s*)', line).group()
  125.  
  126.  
  127. def get_comment_header(line):
  128.     m = re.match('^(\\s*#*)', line)
  129.     if m is None:
  130.         return ''
  131.     
  132.     return m.group(1)
  133.  
  134.